package grade.calculate.pojo;

import grade.calculate.config.Configure;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 封装{@link Configure}启动时配置的参数和其它事件处理结果数据
 *
 * @author fromdrowning
 * @date 2024/2/22 5:36
 */
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Data extends Configure {

    /**
     * 从Excel中读的学生信息集合
     */
    private List<Student> studentList;

    /**
     * 计算后的学生学业表现分集合
     */
    private List<StudentGrade> studentGradeList;

    /**
     * 带参构造方法
     *
     * @param configure {@link Configure}启动时配置的参数
     */
    public Data(Configure configure) {
        // 获取Configure的所有字段
        Field[] fields = configure.getClass().getDeclaredFields();

        // 遍历Configure所有字段 将所有字段赋值给Data
        try {
            for (Field configureField : fields) {
                // 获取到Data与Configure对应的所有字段
                Field dataField = this.getClass()
                        .getSuperclass()
                        .getDeclaredField(configureField.getName());

                // 获取private字段的读取权限
                configureField.setAccessible(true);
                dataField.setAccessible(true);

                dataField.set(this, configureField.get(configure));
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }

        this.studentList = new ArrayList<>();
        this.studentGradeList = new ArrayList<>();
    }
}
